Houdini数学 : フーリエ級数の可視化
はじめに
関数 $ f(x) = x をsinやcosの足し合わせで表現する、フーリエ級数展開をHoudini上で可視化してみました。
https://gyazo.com/239f278dbd57fbbf7dffe3ef1ae9555c
フーリエ級数
関数 $ f(x) が周期 $ 2 \pi で同じ形を繰り返す場合、
$ f(x) はsin波とcos波を足し合わせる形として表すことができます(フーリエ級数展開)
$ f(x) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cdot cos (kx) + b_k \cdot sin(kx))
■簡単なフーリエ級数の可視化
以下のような関数 $ f(x) を考えます。
$ f(x) = \begin{cases} x & (0 \leqq x \leqq 2 \pi) \\ 0 & (それ以外) \end{cases}
■フーリエ級数展開
$ f(x) のフーリエ級数展開は以下のような数式で表すことができます。(※式の導出は長くなるので、後半に書きます)
$ f(x) = \pi - 2 \cdot \sum_{k=1}^\infty (\frac{sin(kx)}{k})
今回は上記の式をHoudini上で実装し、可視化したいと思います。
■フーリエ級数の近似計算
Houdini上では、無限大($ \infty )を扱うことができません。
そこで、フーリエ級数展開式の$ \infty を 整数 $ N に置き換えます。
$ f(x) = \pi - \sum_{k=1}^N (\frac{2 \cdot sin(kx)}{k})
$ = \pi - \frac{2 \cdot sin(x)}{1} - \frac{2 \cdot sin(2x)}{2} - \frac{2 \cdot sin(3x)}{3}- \cdots - \frac{2 \cdot sin((N-1) \cdot x)}{N-1} - \frac{2 \cdot sin(N \cdot x)}{N}
整数 $ N を大きくすることで、本来のフーリエ級数に近い値が求まります。
Houdiniを利用したフーリエ級数の実装
■STEP1: ラインを作る
Lineノードを使用して、X軸プラス方向、長さ $ 2 \pi のラインを作ります。
なめらかな曲線にしたいので、Pointsを多めにとっています。
table:パラメータ
Direction {1, 0, 0}
Length $PI * 2
Points 1000
https://gyazo.com/f0bcbf2adcee3d12b305d9beeb337ff8
■STEP2: 式の計算
今回のフーリエ級数は以下のような数式でした。
$ f(x) = \pi - \sum_{k=1}^N (\frac{2 \cdot sin(kx)}{k})
これをAttributeWrangle上にて実装すると、以下のようになります。
フーリエ級数を計算し、ポイントのY座標に計算値を設定しています。
code:AttributeWrangle(c)
int N = chi("n");
float a0 = 2 * $PI;
float sum = a0 / 2.0;
for (int i = 0; i <= N; i++) {
sum += -2.0 * sin(i * @P.x) / i;
}
@P.y = sum;
https://gyazo.com/e24de1de90083799aded8c496e01b298
■結果
N = 1, 4, 100, 1000 の4パターンを載せてみました。
https://gyazo.com/689873ea74e39b297d32702838f8a373 https://gyazo.com/1ca874a6337225a40ab38917c3d9c1b9 https://gyazo.com/677eb681a0c33fa2f9e08661b8633ad8 https://gyazo.com/f0c3934b16fe0f0abd8618ca8532f0a1
Nを増やすと 直線 y = x に近づくことが分かります。
【式の導出】f(x) = x のフーリエ級数展開
今回、以下の関数f(x)のフーリエ級数を導出したいと思います。
$ f(x) = \begin{cases} x & (0 \leqq x \leqq 2 \pi) \\ 0 & (それ以外) \end{cases}
■必要な数学の知識
三角関数
不定積分・定積分・部分積分
■フーリエ級数
フーリエ級数は以下で計算することができます。
$ f(x) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cdot cos (kx) + b_k \cdot sin(kx))
$ a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx
$ b_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot sin (kx) dx
■STEP1 : $ a_0 を計算してみる
$ a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx に $ k = 0 を代入します。
$ a_0 = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (0) dx
$ = \frac{1}{\pi} \int_0^{2 \pi} x dx
$ = \frac{1}{\pi} \left[ \frac{1}{2} x^2 \right]^{2 \pi}_0
$ = \frac{1}{\pi}(2 \pi ^ 2 - 0)
$ = 2 \pi
計算結果) $ a_0 = 2 \pi
■STEP2 : $ a_k を計算してみる
$ a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx を計算する前に、不定積分 $ \int x \cdot cos (kx) dx を計算します。
$ \int x \cdot cos (kx) dx
$ = x \cdot \frac{1}{k}sin (kx) - \int \frac{1}{k} sin (kx) dx \ \ \ (部分積分)
$ = x \cdot \frac{1}{k}sin (kx) + \frac{1}{k^2} cos (kx) + C
式を整理すると以下のようになります。(積分定数Cは省いています)
$ \int x \cdot cos (kx) dx = \frac{1}{k} \cdot x \cdot sin (kx) + \frac{1}{k^2} cos (kx)
これを $ a_k に代入します。
$ a_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx
$ = \frac{1}{\pi} \left[ \frac{1}{k} \cdot x \cdot sin (kx) + \frac{1}{k^2} cos (kx) \right]_0^{2 \pi}
$ = 0
計算結果) $ a_k = 0
■STEP3 : $ b_k を計算してみる
$ b_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot sin (kx) dx を計算する前に、不定積分 $ \int x \cdot sin (kx) dx を計算します。
$ \int x \cdot sin (kx) dx
$ = -x \cdot \{ \frac{1}{k} cos (kx) \} - \int \{- \frac{1}{k} cos (kx) dx \} \ \ \ (部分積分)
$ = -x \cdot \{ \frac{1}{k} cos (kx) \} + \frac{1}{k^2} sin (kx) + C
式を整理すると以下のようになります。(積分定数Cは省いています)
$ \int x \cdot sin (kx) dx = -x \cdot \{ \frac{1}{k} cos (kx) \} + \frac{1}{k^2} sin (kx)
これを $ b_k に代入します。
$ b_k = \frac{1}{\pi} \int_0^{2 \pi} x \cdot cos (kx) dx
$ = \frac{1}{\pi} \left[ -x \cdot \{ \frac{1}{k} cos (kx) \} + \frac{1}{k^2} sin (kx) \right]_0^{2 \pi}
$ = -\frac{1}{\pi} \cdot \frac{1}{k} \cdot 2 \pi \cdot cos (2 \pi k)
$ = -\frac{1}{\pi} \cdot \frac{1}{k} \cdot 2 \pi
$ = -\frac{2}{k}
計算結果) $ b_k = -\frac{2}{k}
■STEP4 : フーリエ級数展開を計算してみる
計算した $ a_0, a_k, b_k の値をフーリエ級数展開の式に代入し、フーリエ級数展開を計算してみます。
$ a_0 = 2 \pi, a_k = 0, b_k = -\frac{2}{k}
$ f(x) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cdot cos (kx) + b_k \cdot sin(kx))
$ = \frac{2 \pi }{2} + \sum_{k=1}^\infty (0 \cdot cos (kx) - \frac{2}{k} \cdot sin(kx))
$ = \pi + \sum_{k=1}^\infty (-\frac{2}{k} \cdot sin(kx))
計算結果)
$ f(x) のフーリエ級数展開は以下のようになります。
$ f(x) = \pi - \sum_{k=1}^\infty (\frac{2}{k} \cdot sin(kx))
関連